************************************************************************ * SAS MACRO for Exploratory Meta Analysis on Uniform Assessment Battery across Aging Studies * Last Updated: Jan. 27th, 2009 ************************************************************************; /* Copyright Notice [EXPLORATORY META ANALYSIS ON UNIFORM ASSESSMENT BATTERY ACROSS AGING STUDIES] at 2009 Wake Forest University Health Sciences. All Rights Reserved. */ /*Disclaimer [EXPLORATORY META ANALYSIS ON UNIFORM ASSESSMENT BATTERY ACROSS AGING STUDIES] IS AN EXPERIMENTAL RESEARCH PRODUCT. WAKE FOREST UNIVERSITY HEALTH SCIENCES (WFUHS) EXPRESSLY DISCLAIMS ANY WARRANTY FOR [EXPLORATORY META ANALYSIS ON UNIFORM ASSESSMENT BATTERY ACROSS AGING STUDIES], ANY RELATED DOCUMENTATION, AND RELATED MATERIALS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OR MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NONINFRINGEMENT. WFUHS MAKES NO WARRANTY WITH RESPECT TO THE ACCURACY OR COMPLETENESS OF [EXPLORATORY META ANALYSIS ON UNIFORM ASSESSMENT BATTERY ACROSS AGING STUDIES], AND SHALL HAVE NO LIABILITY BASED ON CLAIMS OF ERRORS. THE ENTIRE RISK ARISING OUT OF THE USE OR PERFORMANCE OF [EXPLORATORY META ANALYSIS ON UNIFORM ASSESSMENT BATTERY ACROSS AGING STUDIES] REMAINS WITH THE USER OF SUCH PROGRAMS. In no event shall WFUHS be liable for any damages whatsoever (including, without limitation, damages for loss of life or other pecuniary loss) arising out of the use of or inability to use [EXPLORATORY META ANALYSIS ON UNIFORM ASSESSMENT BATTERY ACROSS AGING STUDIES], even if WFUHS has been advised of the possibility of such damages. Because some states/jurisdictions do not allow the exclusion or limitation of liability for consequential or incidental damages, the above limitation may not apply to you. IN NO EVENT SHALL THE TOTAL LIABILITY OF WFUHS, ITS DIRECTORS, OFFICERS, TRUSTEES, PERSONNEL, AGENTS, EMPLOYEES, STUDENTS, SUCCESSORS AND ASSIGNS OF WAKE FOREST UNIVERSITY HEALTH SCIENCES UNDER THIS AGREEMENT OR OTHERWISE IN CONNECTION WITH [EXPLORATORY META ANALYSIS ON UNIFORM ASSESSMENT BATTERY ACROSS AGING STUDIES], FOR ANY REASON, EXCEED THE AMOUNT OF THE LICENSE FEE PAID BY USER TO WFUHS FOR USE OF [EXPLORATORY META ANALYSIS ON UNIFORM ASSESSMENT BATTERY ACROSS AGING STUDIES]. */ * --------------------------- Begin of MACROS -------------------- ; * In general you do not have to change the statements within MACROS; option macrogen; %macro slope(SDdata, Studyid, X, Y, CovX, Studies); proc sort data = &SDdata; by &Studyid ; ods output ParameterEstimates = PE&Y&X SimpleStatistics = N&Y&X; proc reg data = &SDdata simple; by &Studyid ; model &Y = &X &CovX / clb; run; ods output close; data N&Y&X; set N&Y&X; if Variable='Intercept'; &Y._N= put(Sum, best.); &Y._N2 = Sum; keep &Studyid &Y._N &Y._N2; run; proc sort; by &Studyid ; data PE&Y&X; set PE&Y&X; format variable $20.; BetaP&Y&X= put(Estimate,5.2) || " ("|| put(Probt, pvalue5.) ||")"; &Y.est = estimate; &Y.p = Probt; keep &Studyid variable BetaP&Y&X &Y.est &Y.p; if variable = "&X"; run; proc sort; by &Studyid ; data PE&Y&X ; merge PE&Y&X N&Y&X; by &Studyid ; index=1; run; proc sort; by index &Studyid ; run; ods output ParameterEstimates = AllPE&Y&X SimpleStatistics = AllN&Y&X; proc reg data=&SDdata simple; model &Y = &X &CovX &studies/clb; run; ods output close; data AllPE&Y&X; set AllPE&Y&X; length varb $20.; varb=compress(right(variable)); BetaP&Y&X= put(Estimate,5.2) || " ("|| put(Probt, pvalue5.) ||")"; &Y.est = estimate; &Y.p = Probt; keep varb BetaP&Y&X &Y.est &Y.p; if variable = "&X"; run; proc sort; by varb; data allN&Y&X; set allN&Y&X; if Variable="Intercept"; length varb $20.; varb=compress(right(variable)); &Y._N= put(Sum, best.); &Y._N2 = Sum; keep varb &Y._N &Y._N2; varb = "&X"; run; proc sort; by varb; data AllPE&Y&X; merge AllPE&Y&X allN&Y&X; by varb; length &Studyid $5.; &Studyid="Combined"; index=2; rename varb=variable; run; proc sort; by index &Studyid ; data PE&Y&X ; set PE&Y&X AllPE&Y&X; by index &Studyid; run; proc sort; by &Studyid ; run; %mend slope; %macro header_bwh_small; /* For proc report right after data = */ split = '*' ps=42 ls=160 center headline nowd style(report)={just=center} style(header)={font_face=arial font_size=1.5 foreground=black background=white} style(column)={font_face=arial font_size=1.5}; %mend header_bwh_small; %macro bwh_small_right; /* For proc report define statement */ style(header)={just=center foreground=black background=white font_face=arial font_size=1.0 font_weight=bold} style(column)={just=right foreground=black background=white font_face=arial font_size=1.0 font_weight=bold} %mend bwh_small_right; %macro bwh_small_left; /* For proc report define statement */ style(header)={just=center foreground=black background=white font_face=arial font_size=1.0 font_weight=bold} style(column)={just=left foreground=black background=white font_face=arial font_size=1.0 font_weight=bold} %mend bwh_small_left; %macro bwh_small_center; /* For proc report define statement */ style(header)={just=center foreground=black background=white font_face=arial font_size=1.0 font_weight=bold} style(column)={just=center foreground=black background=white font_face=arial font_size=1.0 font_weight=bold} %mend bwh_small_center; %macro report (data, title, Studyid, Col); PROC REPORT DATA = &data %header_bwh_small; column &col &Studyid %DO j = 1 %TO &Ny; ("&&YL&j" &&&Y&j.._N &&Y&j) %END; ; define &col / order order=internal 'Items' format = $20. %bwh_small_left; define &Studyid/ display 'Study' width=40 %bwh_small_center; %DO j = 1 %TO &Ny; DEFINE &&&Y&j.._N/display 'N' width=5 %bwh_small_center; DEFINE &&Y&j/display 'b(p-value)' width=20 %bwh_small_center; %END; compute after &col/ style=[background=white]; line ' '; endcomp; title1 " Regression Coefficient (SD unit) Adjusted by &title "; title2 " as reported on &date"; run; %mend report; %MACRO report0(adjvar, SDdata, Studyid, Studies, Path); %DO i = 1 %TO &Nx; %DO j = 1 %TO &Ny; %slope(&SDdata, &Studyid, &&X&i, &&Y&j, &adjvar,&Studies); %END; %END; %DO i = 1 %TO &Nx; DATA &&X&i; MERGE %DO j = 1 %TO &Ny; PE&&Y&j&&X&i %END; ; BY &Studyid; RENAME %DO j = 1 %TO &Ny; BetaP&&Y&j&&X&i = &&Y&j %END; ; LENGTH var $20.; var = "&&X&i"; RUN: proc sort;by var &Studyid ; run; %END; DATA total; SET %DO i = 1 %TO &Nx; &&X&i %END; ; BY var &Studyid; proc print ; run; %DO j = 1 %TO &Ny; data total&j; set total; phys = "&&YL&j"; keep &studyid variable &&Y&j..est &&Y&j..p &&Y&j.._N2 phys; rename &&Y&j..est = b &&Y&j..p = pvalue &&Y&j.._N2 = N; run; %END; data TT; set %DO j = 1 %TO &Ny; total&j %END; ; label b = 'Regressin Coefficient'; label phys = 'Physical Performance'; Label N = 'Sample Size'; run; data _null_; date=today(); call symput('date',put(date,mmddyy.)); run; options ps=120 ls=64 orientation=landscape; ods listing close; ods rtf file = "&path.\slope_SD_adjby&adjvar&sysdate..rtf" bodytitle; ods rtf startpage=yes; %report(total,&adjvar,&Studyid, var); ods rtf close; ods listing; %MEND report0; * ---------------------- End of MACROS --------------------------; * Indicate your data location and assign libarary name; libname lib '&path'; * Put the data in your current working space; * and recode study by making dummy variables; data study; set lib.study; study1 = 0; study2 = 0; study4 =0; if studyid ='study1' then study1 = 1; if studyid = 'study2' then study2 = 1; if studyid = 'study4' then study4 = 1; run; * Define MACRO variables; * Number of predictors; %LET Nx = 3; * Number of outcomes; %LET Ny = 4; * input SAS data for the MACRO; %LET data = study; * Specify study indicator; %LET Studyid = studyid; %LET Studies = study1 study2 study4; * Specify predictors (here biomarkers); %LET X3 = CRP; %LET X2 = IL6; %LET X1 = TNF_alpha; * Specify outcomes (here physical performance); %LET Y4 = Grip; %LET Y2 = SPPB; %LET Y3 = fourm_walk; %LET Y1 = chairrise; * Specify labels for outcomes; %LET YL4 = GRIP; %LET YL2 = SPPB; %LET YL3 = Gait Speed; %LET YL1 = Five Chair Rise Time (Sec); * Specify where you want your output file to be saved; %LET path = C:; * Run the MACRO; %report0(gender race, &data, &Studyid, &Studies, &path); * The macro already genderates the output data for bubble plot in MATLAB; proc export data= tt outfile='&path.\tt.xls' dbms=excel replace; run;